#!/usr/bin/env groovy
library 'status-jenkins-lib@v1.9.24'

pipeline {

  agent { label 'linux' }

  parameters {
    string(
      name: 'APK_URL',
      description: 'URL of APK to be tested(base for upgrade, usually release build)',
    )
     string(
      name: 'APK_URL_UPGRADE',
      description: 'URL of APK of upgraded application (installed on top of base)',
    )
     string(
      name: 'KEYWORD_EXPRESSION',
      description: 'This will run tests which contain names that match the given string expression  (Optional)',
      defaultValue: '',
    )
     string(
      name: 'TR_CASE_IDS',
      description: 'IDs of the TestRail case, separated by a comma (Optional)',
      defaultValue: '',
    )
  }

  options {
    disableConcurrentBuilds()
    buildDiscarder(logRotator(
      numToKeepStr: '10',
      daysToKeepStr: '30',
      artifactNumToKeepStr: '1',
    ))
  }

  environment {
    /* Avoid race conditions with other builds using virtualenv. */
    VIRTUAL_ENV = "${WORKSPACE_TMP}/venv"
    PATH = "${VIRTUAL_ENV}/bin:${PATH}"
  }

  stages {
    stage('Prep') {
      steps { script {
        if (params.APK_URL == null) {
          error("APK_URL parameter not set!")
        }
        if (params.APK_URL_UPGRADE == null) {
          error("APK_URL_UPGRADE parameter not set!")
        }
      } }
    }

    stage('Setup') {
      steps { script {
        dir('test/appium') {
          sh "python3 -m venv ${VIRTUAL_ENV}"
          sh 'pip3 install -r requirements.txt'
        }
      } }
    }

    stage('Test') {
      steps { script {
       /* for managing optional arguments */
        def extraPytestOpts = ''
        if (params.TR_CASE_IDS != '') {
          extraPytestOpts = "--run_testrail_ids='${params.TR_CASE_IDS}'"
        }
        withCredentials([
          usernamePassword(
            credentialsId:  'test-rail-api',
            usernameVariable: 'TESTRAIL_USER',
            passwordVariable: 'TESTRAIL_PASS'
          ),
          usernamePassword(
            credentialsId:  'sauce-labs-api',
            usernameVariable: 'SAUCE_USERNAME',
            passwordVariable: 'SAUCE_ACCESS_KEY'
          ),
          string(
            credentialsId: 'etherscan-api-key',
            variable: 'ETHERSCAN_API_KEY'
          ),
          string(
            credentialsId: 'infura-e2e-token',
            variable: 'WEB3_INFURA_PROJECT_ID'
          ),
          file(
            credentialsId: "mobile-tests-eth-accounts",
            variable: 'TEST_ETH_ACCOUNTS_FILE'
          ),
        ]) {
          dir('test/appium/tests') {
            /* Provide Eth test accounts secrets. */
            sh 'cp -f $TEST_ETH_ACCOUNTS_FILE users.py'
            sh """
              python3 -m pytest \
                -m "upgrade" \
                -k \"${params.KEYWORD_EXPRESSION}\" \
                --numprocesses 4 \
                --rerun_count=2 \
                --testrail_report=True \
                --apk=${params.APK_URL} \
                --apk_upgrade=${params.APK_URL_UPGRADE} \
                 ${extraPytestOpts}
            """
          }
        }
      }
    } }
  }

  post {
    always {
      script {
        sauce('sauce-labs-cred') {
          saucePublisher()
        }
      }
    }
    success {
      script {
        junit(
          testDataPublishers: [[$class: 'SauceOnDemandReportPublisher', jobVisibility: 'public']],
          testResults: 'test/appium/tests/*.xml'
        )
      }
    }
    cleanup {
      sh 'make purge'
    }
  }
}
